<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>

    <script>
        // 依赖全局变量，命名容易冲突
        // 函数内部有类似功能，提高代码复用
        // var sum = 0;
        // function run () {
        //     console.log( '合计数据是' + sum);
        // }
        // var sum2 = 0;
        // function run2 () {
        //     console.log('第二个功能函数：' + sum2);
        // }

        // 第二版
        // function run (s2,passNum) {
        //     console.log(s2 + passNum);
        // }
        // run('合计数据是',1);
        // run('第二个功能函数：',2);

        // 第三版
        // 保护了run函数，不再是全局的，而是属于某个对象的
        // var obj = {
        //     name: 'jack',
        //     myRun: function (s2, passNum) {
        //         console.log(this.name + '+' + s2 + passNum);
        //     }
        // }
        // var obj2 = {
        //     name: 'rose',
        //     myRun: function (s2, passNum) {
        //         console.log(this.name + '+' + s2 + passNum);
        //     }
        // }

        // obj.myRun('合计数据是', 1);
        // obj.myRun('第二个功能函数：', 2);
        // // 新添加个对象来使用
        // obj2.myRun('合计数据是', 1);
        // obj2.myRun('第二个功能函数：', 2);
        
        
        // 第四版
        // let fn = function (s2, passNum) {
        //         console.log(this.name + '+' + s2 + passNum);
        // };
        // let obj = {
        //     name: 'jack',
        //     myRun: fn
        // }
        // let obj2 = {
        //     name: 'rose',
        //     myRun: fn
        // }
        // obj.myRun('合计数据是', 1);
        // obj.myRun('第二个功能函数：', 2);
        // // 新添加个对象来使用
        // obj2.myRun('合计数据是', 1);
        // obj2.myRun('第二个功能函数：', 2);

        // 第五版
        // 创建对象的工厂,每次返回函数里面的this
        // let fn = function (s2, passNum) {
        //         console.log(this.name + '+' + s2 + passNum);
        // };
        // function Person (name) {
        //     this.name = name; // 保存该名字
        //     // 隐式return this;
        //     this. myRun = fn;
        // }
        
        // let p1 = new Person('杰克'); 
        // let p2 = new Person('肉丝'); 

        // 第六版： 相同的事务放在构造函数中，会随着对象创建的次数，反复的执行，没有必要。
        // 通过一次将祖宗挂载该函数，同样能实现相同的效果

        let fn = function (s2, passNum) {
                console.log(this.name + '+' + s2 + passNum);
        };
        function Person (name) {
            this.name = name; // 保存该名字
            // 隐式return this;
            // console.log('执行了');
            // this.myRun = fn;  // 该代码会被执行8次
        }
        // 在这里只执行一次
        console.log('执行了');  // 该代码执行一次
        Person.prototype.myRun = fn;
        
        let p1 = new Person('杰克'); 
        let p2 = new Person('肉丝'); 
        let p3 = new Person('肉丝'); 
        let p4 = new Person('肉丝'); 
        let p5 = new Person('肉丝'); 
        let p6 = new Person('肉丝'); 
        let p7 = new Person('肉丝'); 
        let p8 = new Person('肉丝'); 

        // 人来连接  祖宗 影响 实例对象： 构造函数.prototype.xxx = '值'
        // JS解析引擎  实例 找到 祖宗:   p1.__proto__ 找到 其原型=> 构造函数.prototype

        

    </script>
</body>

</html>